
/**
 * jfreechart出现乱码
 * 原因：
 * jfreechart主要是用来动态产生各种数据图形的，可最初使用的时候大都会碰到图片中的中文乱码或是一个小方块的情况。

 * 仔细研究主要有以下2种原因：
 * 1：服务器缺少中文字体，这多发生在Hp等unix操作系统上，解决的方法就是下载可用字体库到系统中，
 * 有人也提出在Windows上产生图片在传回到Unix主机上的方法。
 * 2：软件版本问题，jfreechart-1.0.10有人说没有问题，但jfreechart-1.0.11到13都有问题，我用的最新的jfreechart-1.0.13不做设置是有问题的。
 * 究其原因，是它代码的内部设置的字体有问题.
 * 解决办法：整个图标分成三部分chart   title，chart 的plot还有chart的   legend三个部分需要对他们分别设置字体就对了。
 */
package com.helloweenvsfei.jfreechart;  
  
import java.awt.Color;  
import java.awt.Font;
  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStream;  

import javax.servlet.http.HttpServletRequest;

import org.jfree.chart.ChartFactory;  
import org.jfree.chart.ChartUtilities;  
import org.jfree.chart.JFreeChart;  
import org.jfree.chart.axis.CategoryAxis;  
import org.jfree.chart.axis.CategoryLabelPositions;  
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.CategoryPlot;  
import org.jfree.chart.plot.PlotOrientation;  
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.data.category.CategoryDataset;  
import org.jfree.data.category.DefaultCategoryDataset;  
import org.jfree.ui.RectangleInsets;  
import org.jfree.chart.title.TextTitle;
  
public class AreaChart {  
   
	 public String getAreaChart(HttpServletRequest request){

        // 获取数据集对象  
        CategoryDataset dataset = createDataset();  
        // 创建图形对象  
        JFreeChart jfreechart = ChartFactory.createAreaChart("2012年图书销售量排名",  
                "按季度", "销量", dataset, PlotOrientation.VERTICAL, true, true,  
                false);  
        TextTitle textTitle = jfreechart.getTitle();
        textTitle.setFont(new Font("黑体", Font.BOLD, 24));//设置标题字体，防止出现乱码
        
        CategoryPlot plot = jfreechart.getCategoryPlot();//活得图标区域对象
        CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,15));//设置X轴坐标上的文字
        domainAxis.setLabelFont(new Font("宋体",Font.PLAIN,15));//设置x轴的标题文字
        ValueAxis rAxis = plot.getRangeAxis();
        rAxis.setTickLabelFont(new Font("宋体",Font.PLAIN,15));//设置Y轴坐标上的文字
        rAxis.setLabelFont(new Font("宋体",Font.PLAIN,15));//设置Y轴的标题文字
        
        // 获得图表区域对象  
        CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot();  
        //设置前景色为50%透明  
        categoryplot.setForegroundAlpha(0.5F);  
        //设置X轴偏移量  
        categoryplot.setAxisOffset(new RectangleInsets(5D, 5D, 5D, 5D));  
        //设置北景色为浅灰色  
        categoryplot.setBackgroundPaint(Color.lightGray);  
        //设置显示网格线  
        categoryplot.setDomainGridlinesVisible(true);  
        //设置网格线为白色  
        categoryplot.setDomainGridlinePaint(Color.white);  
        //设置显示边界线  
        categoryplot.setRangeGridlinesVisible(true);  
        //设置显示边界线为白色  
        categoryplot.setRangeGridlinePaint(Color.white);  
        //获得X轴对象  
        CategoryAxis categoryaxis = categoryplot.getDomainAxis();  
        //设置X轴标签位置为45度角  
        categoryaxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);  
        //设置与X轴的补白为0  
        categoryaxis.setLowerMargin(0.0D);  
        categoryaxis.setUpperMargin(0.0D);  
          
        // 将图表已数据流的方式返回给客户端  
 
        
        String filename ="";
    	
		try {
			filename = ServletUtilities.saveChartAsPNG(jfreechart, 500, 580, null, request.getSession());
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}

		String graphURL = request.getContextPath() + "/DisplayChart?filename=" + filename;		
		return graphURL;
       
	 } 
    /** 
     * 返回数据集 
     *  
     * @return 
     */  
    private static CategoryDataset createDataset() {  
        // 时间维度  
        String[] category1 = { "第一季度", "第二季度", "第三季度", "第四季度" };  
        // 分类维度  
        String[] category2 = { "JAVA", "C/C++", "PHP" };  
        DefaultCategoryDataset defaultdataset = new DefaultCategoryDataset();  
        for (int i = 0; i < category1.length; i++) {  
            String category = category1[i];  
            for (int j = 0; j < category2.length; j++) {  
                String cat = category2[j];  
                // 模拟添加数据  
                defaultdataset.addValue(DataUtils.getRandomData(), cat, category);  
            }  
        }  
        return defaultdataset;  
    }  
  
  
}  
